#include "ps2.h"

//这个文件用了软件spi  别忘记改引脚备注


//PA4->CS
//PA5->CLK
//PA6->DI
//PA7->CMD



static uint8_t PS2_data[9];
const uint8_t PS2_cmnd[9] = {0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
JOYSTICK_TypeDef rc_data;



// PS2初始化
void AX_PS2_Init(void) {
    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); // CS高
}



// 软件模拟SPI写命令+读数据
static uint8_t PS2_ReadWriteByte(uint8_t cmd) {
    uint8_t res = 0;
    for (uint8_t i = 0; i < 8; i++) {
        HAL_GPIO_WritePin(CMD_GPIO_Port, CMD_Pin, (cmd & (1 << i)) ? GPIO_PIN_SET : GPIO_PIN_RESET);        // 写CMD位 (MOSI)
        HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET);                                   // 生成CLK下降沿
        Delay_us(16);
        if (HAL_GPIO_ReadPin(DI_GPIO_Port, DI_Pin))                                                         // 读DATA位 (MISO)
            res |= (1 << i);
        HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET);                                     // CLK上升沿
        Delay_us(16);
    }
    return res;
}


// 读取手柄数据
void AX_PS2_ScanKey(JOYSTICK_TypeDef* JoystickStruct) {
    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); // CS拉低
    for (int i = 0; i < 9; i++) {
        PS2_data[i] = PS2_ReadWriteByte(PS2_cmnd[i]);
    }
    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); // CS拉高
    // 解析数据
    JoystickStruct->mode = PS2_data[1];
    JoystickStruct->btn1 = ~PS2_data[3];
    JoystickStruct->btn2 = ~PS2_data[4];
    //将遥控器通道值区间变为【-128，127】，并且符号符合右手系，即向上推为正，向左推为正
    JoystickStruct->RJoy_LR = -((int16_t)PS2_data[5]-128);
    JoystickStruct->RJoy_UD = -((int16_t)PS2_data[6]-127);
    JoystickStruct->LJoy_LR = -((int16_t)PS2_data[7]-128);
    JoystickStruct->LJoy_UD = -((int16_t)PS2_data[8]-127);
}

void Remote_control() {
    AX_PS2_ScanKey(&rc_data);// 获取ps2状态
    HAL_Delay(2);//最低延时2ms
}
